package com.dc.aimc.gateway.config;

import com.alibaba.fastjson.JSON;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.config.GatewayProperties;
import org.springframework.cloud.gateway.support.NameUtils;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;

import java.util.ArrayList;
import java.util.List;

@Log4j2
@Primary
@Configuration
public class Knife4jResourceConfig implements SwaggerResourcesProvider {

    @Autowired
    private RouteConfig routeConfig;

    private final GatewayProperties gatewayProperties;

    public Knife4jResourceConfig(GatewayProperties gatewayProperties) {
        this.gatewayProperties = gatewayProperties;
    }

    @Override
    public List<SwaggerResource> get() {
        List<SwaggerResource> resources = new ArrayList<>();
        List<String> routes = new ArrayList<>();
        for (RouteConfig.Route route : routeConfig.getRoutes()) {
            routes.add(route.getId());
        }
        log.info("routes: {}", JSON.toJSONString(routes));
        gatewayProperties
            .getRoutes()
            .stream()
            .filter(routeDefinition -> routes.contains(routeDefinition.getId()))
            .forEach(route ->
                route
                    .getPredicates()
                    .stream()
                    .filter(predicateDefinition -> "Path".equalsIgnoreCase(predicateDefinition.getName()))
                    .forEach(predicateDefinition ->
                        resources.add(swaggerResource(route.getId(), predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0").replace("**", "v2/api-docs")))
                    )
            );

        return resources;
    }

    private SwaggerResource swaggerResource(String name, String location) {
        SwaggerResource swaggerResource = new SwaggerResource();
        swaggerResource.setName(name);
        swaggerResource.setLocation(location);
        swaggerResource.setSwaggerVersion("2.0");
        return swaggerResource;
    }
}
